package com.proyecto.core.servicios;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.StringTokenizer;
import javax.servlet.http.HttpSession;
import nextapp.echo2.app.ApplicationInstance;
import nextapp.echo2.app.TextField;
import nextapp.echo2.webcontainer.command.BrowserOpenWindowCommand;
import nextapp.echo2.webrender.WebRenderServlet;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;

import com.proyecto.core.Utilidades.ObtenerFecha;
import com.proyecto.core.Utilidades.UtilReflect;
import com.proyecto.core.vista.echo.componentes.CPReporte;

public class ProcesarReporte {
	
	private String ruta="reportes.xml";
	private static SAXBuilder builder = new SAXBuilder(false);
	private HashMap<String, Object> paramMap = new HashMap<String, Object>();
	
	public  ProcesarReporte(String reporte, Object pojo){
		try {
			this.paramMap.put("NOMBRE_REPORTE", reporte);
			Element raiz = builder.build(Thread.currentThread().getContextClassLoader().getResource(ruta).getPath()).getRootElement();
			List<Element> reportes = raiz.getChildren();
			for (int i = 0; i < reportes.size(); i++) {
				if (reportes.get(i).getAttributeValue("nombre").equalsIgnoreCase(reporte)) {
					extraerDatosReporte(reportes.get(i), pojo);
					break;
				}
			}
		} catch (JDOMException e) {e.printStackTrace();
		} catch (IOException e) {e.printStackTrace();}
	}
	
	public void extraerDatosReporte(Element reporte, Object pojo){
		String parametro="";
		
		Object objeto = null;
		HttpSession sesion = WebRenderServlet.getActiveConnection().getRequest().getSession();
		List<Element> parametrosDinamicos = null!=reporte.getChild("parametrosDinamicos")?reporte.getChild("parametrosDinamicos").getChildren():new ArrayList<Element>();
		List<Element> parametrosEstaticos = reporte.getChild("parametrosEstaticos").getChildren();
		try{
			for(int i =0;i<parametrosDinamicos.size(); i++){
				parametro = parametrosDinamicos.get(i).getAttributeValue("parametro");
				if (pojo instanceof CPReporte) {
					String propiedadToken = new StringTokenizer(parametrosDinamicos.get(i).getAttributeValue("valor"),".").nextToken();
					objeto = UtilReflect.invocarMetodoGet(pojo, parametrosDinamicos.get(i).getAttributeValue("valor"), null);
					if(objeto instanceof TextField){
						TextField tf = (TextField)UtilReflect.invocarMetodoGet(pojo, propiedadToken,null);
						objeto = (tf.getStyleName()!=null && tf.getStyleName().equalsIgnoreCase("2OpenLabs.TextField.CampoFecha"))?ObtenerFecha.cambiarDDMMYYYY_YYYYMMDD(tf.getText()):tf.getText();
					}else {
						if(parametrosDinamicos.get(i).getAttributeValue("valor").startsWith("sesion")){
							String parametroReporte =  parametrosDinamicos.get(i).getAttributeValue("valor").substring(7);
							String atributoSession = parametroReporte.substring(0, parametroReporte.indexOf("."));
							pojo = sesion.getAttribute(atributoSession);
							parametroReporte = parametroReporte.substring(parametroReporte.indexOf(".")+1);
							objeto = UtilReflect.invocarMetodoGet(pojo, parametroReporte, null);
						}else{
							objeto = UtilReflect.invocarMetodoGet(pojo, parametrosDinamicos.get(i).getAttributeValue("valor"), null);
						}
					}
					objeto = this.castearObjeto(objeto, parametrosDinamicos.get(i).getAttributeValue("tipo"));
				}else{
					objeto = UtilReflect.invocarMetodoGet(pojo, parametrosDinamicos.get(i).getAttributeValue("valor"), null);
				}
				this.paramMap.put(parametro, objeto);
			}
			for(int i =0;i<parametrosEstaticos.size(); i++){
				parametro = parametrosEstaticos.get(i).getAttributeValue("parametro");
				objeto =  parametrosEstaticos.get(i).getAttributeValue("valor");
				objeto = (parametro.equalsIgnoreCase("SUBREPORT_DIR")||parametro.equalsIgnoreCase("SUBREPORT_DIR_BASE"))?
						sesion.getServletContext().getRealPath(objeto.toString()):objeto;
				objeto = this.castearObjeto(objeto, parametrosEstaticos.get(i).getAttributeValue("tipo"));
				this.paramMap.put(parametro, objeto);
			}
		sesion.setAttribute("hm", paramMap);
		ApplicationInstance.getActive().enqueueCommand(new BrowserOpenWindowCommand("ReporteGenerico", "Reporte", "width=1024,height=768"));
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	private Object castearObjeto(Object objeto, String tipoDato){
		if (tipoDato !=null){
			if(tipoDato.equalsIgnoreCase("java.lang.Integer")){
				return Integer.parseInt(objeto.toString());
			}else if(tipoDato.equalsIgnoreCase("java.lang.Double")){
				return Double.parseDouble(objeto.toString());
			}
		}
		return objeto;
	}

}